/*
Copyright [2020] [https://www.xiaonuo.vip]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

XiaoNuo采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：

1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改XiaoNuo源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处，作者声明等。
4.分发源码时候，请注明软件出处 https://gitee.com/xiaonuobase/xiaonuo-vue
5.在修改包名，模块名称，项目代码等时，请注明软件出处 https://gitee.com/xiaonuobase/xiaonuo-vue
6.若您的项目无法满足以上几点，可申请商业授权，获取XiaoNuo商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package com.cn.xiaonuo.core.pojo.login;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.cn.xiaonuo.core.consts.CommonConstant;
import com.cn.xiaonuo.core.pojo.node.LoginMenuTreeNode;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * 登录用户模型
 *
 * @author xuyuxiang
 * @date 2020/3/11 12:21
 */
@Data
public class SysLoginUser implements UserDetails, Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    private Long id;
    /**
     * 会员号（自增）
     */
    private String username;

    /**
     * 密码 默认密码：111111
     */
    private String password;

    /**
     * 支付密码
     */
    private String payPassword;

    /**
     * 用户昵称
     */
    private String nickName;

    /**
     * 手机号码
     */
    private String phone;

    /**
     * 头像
     */
    private String avatar;

    /**
     * 用户积分
     */
    private BigDecimal integration;

    /**
     * 抽奖赠送的兑酒券
     */
    private BigDecimal prDjj;

    /**
     *
     */
    private BigDecimal djj;

    /**
     * 国甄购物券
     */
    private BigDecimal gzGwj;

    /**
     * STC币
     */
    private BigDecimal lockStc;

    /**
     *
     */
    private BigDecimal unlockStc;

    /**
     * 购买STC特殊商品等级划分：1村民 2中农 3富农 4财主
     */
    private Integer stcLevel;

    /**
     * 店主上级的提成
     */
    private BigDecimal royalty;

    /**
     * 余额
     */
    private Double money;

    /**
     * 客户端标识
     */
    private String clientId;

    /**
     * 客户端密钥
     */
    private String clientSecret;

    /**
     * 微信OpenId
     */
    private String openId;

    /**
     *
     */
    private String ymOpenId;

    /**
     * 海口绿色金服集聚区的openid
     */
    private String jfOpenId;

    /**
     * 客户唯一标识
     */
    private String uinionId;

    /**
     * 账号状态：0 禁用， 1 启用
     */
    private Integer status;

    /**
     *
     */
    private Integer loginCount;

    /**
     * 多语言
     */
    private String multilingual;

    /**
     *
     */
    private Date lastLogin;

    /**
     * 证件类型
     */
    private Integer cardType;

    /**
     * 证件号码
     */
    private String cardNumber;

    /**
     * 身份证正面
     */
    private String cardFrontImageUrl;

    /**
     * 身份证反面
     */
    private String cardBackImageUrl;

    /**
     * 手持身份证
     */
    private String cardHandImageUrl;

    /**
     * 0：女，1：男
     */
    private Boolean sex;

    /**
     * 地区
     */
    private String zone;

    /**
     * 省份
     */
    private String province;

    /**
     * 1:搜了客服  2：财务  4：普通用户  10:财务查账 100超级管理员
     */
    private String rules;

    /**
     * 是否存在上级
     */
    private Integer isSuperior;

    /**
     * 创建时间
     */
    private Timestamp createdAt;

    /**
     * 最后更新时间
     */
    private Timestamp updatedAt;

    /**
     * 文交所账号是否开通：0没有开通，1开通
     */
    private Integer isWjsUser;

    /**
     * 暂未使用
     */
    private Integer isAgent;

    /**
     * 1区代2市代3省代
     */
    private Integer agent;

    /**
     * 分组id
     */
    private Integer groupId;

    /**
     *
     */
    private String agentArea;

    /**
     * 总股份数
     */
    private Integer totalShares;

    /**
     * 直播：0否1是
     */
    private Integer isLiver;

    /**
     * 个性签名
     */
    private String signPer;

    /**
     * 账号
     */
    private String account;

    /**
     * 姓名
     */
    private String name;

    /**
     * 生日
     */
    private Date birthday;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 电话
     */
    private String tel;

    /**
     * 管理员类型（0超级管理员 1非管理员）
     */
    private Integer adminType;

    /**
     * 最后登陆IP
     */
    private String lastLoginIp;

    /**
     * 最后登陆时间
     */
    private String lastLoginTime;

    /**
     * 最后登陆地址
     */
    private String lastLoginAddress;

    /**
     * 最后登陆所用浏览器
     */
    private String lastLoginBrowser;

    /**
     * 最后登陆所用系统
     */
    private String lastLoginOs;

    /**
     * 员工信息
     */
    private LoginEmpInfo loginEmpInfo;

    /**
     * 具备应用信息
     */
    private List<Dict> apps;

    /**
     * 角色信息
     */
    private List<Dict> roles;

    /**
     * 权限信息
     */
    private List<String> permissions;

    /**
     * 登录菜单信息，AntDesign版本菜单
     */
    private List<LoginMenuTreeNode> menus;

    /**
     * 数据范围信息
     */
    private List<Long> dataScopes;

    /**
     * 租户信息
     */
    private Dict tenants;

    /**
     * 角色名称集合
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        ArrayList<XiaoNuoAuthority> grantedAuthorities = CollectionUtil.newArrayList();
        if (ObjectUtil.isNotEmpty(roles)) {
            roles.forEach(dict -> {
                String roleName = dict.getStr(CommonConstant.NAME);
                XiaoNuoAuthority xiaoNuoAuthority = new XiaoNuoAuthority(roleName);
                grantedAuthorities.add(xiaoNuoAuthority);
            });
        }
        return grantedAuthorities;
    }

    @Override
    public String getPassword() {
        return null;
    }

    @Override
    public String getUsername() {
        return this.account;
    }

    @Override
    public boolean isAccountNonExpired() {
        //能生成loginUser就是jwt解析成功，没锁定
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        //能生成loginUser就是jwt解析成功，没锁定
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        //能生成loginUser就是jwt解析成功，没锁定
        return true;
    }

    @Override
    public boolean isEnabled() {
        //能生成loginUser就是jwt解析成功，没锁定
        return true;
    }
}
